package demo8;


import java.util.Scanner;

// 内存不可见问题： volatile 来解决
public class Test18 {
    public static  volatile int isQuite;
    public static  int isQuite2;

    public static void main01(String[] args) {
        Thread t1=new Thread(()->{
            // 这里当我们在线程t1 中进行while循环
            // 线程t2中修改isQuite的值来让t1线程结束循环
            // 当t2 中修改值之后，t1 并没有停下来：
            // 原因： 由于cpu执行速率特别快，每次读取数据在内存中读取，就导致开销特别大
            // 所有 java程序就自动对代码进行优化，就只从内存中读取一次，后面都在寄存器中读取，
            // 就导致t2修改 isQuite 值之后，t1 并没有读取内存中isQuite的值，所以循环就没有停下来
            // 此时 ，关键词  volatile 就可以帮我们解决这个问题
            //  volatile 就停止这种优化，让t1读取内存中的isQuite值
            while(isQuite == 0){

            }
            System.out.println("线程结束");
        });
        t1.start();
        Thread t2=new Thread(()->{
            System.out.println("输入isQuite的值：");
            Scanner in=new Scanner(System.in);
            isQuite=in.nextInt();
        });
        t2.start();
    }


    public static void main(String[] args) {
        Thread t1=new Thread(()->{
            // 这里为什么isQuite2没有volatile修饰，照样可以读取isQuite2的值
            // 理由： 当我们进行sleep休眠时，cpu的速度就慢下来了，此时读取内存的开销相对来说就没有那么大了
            while(isQuite2 == 0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("线程结束");
        });
        t1.start();
        Thread t2=new Thread(()->{
            System.out.println("输入isQuite2的值：");
            Scanner in=new Scanner(System.in);
            isQuite2=in.nextInt();
        });
        t2.start();
    }
}
